/*!
 * \file StateMonitor.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 状态监控器头文件
 * 
 * \details 本文件定义了WonderTrader数据服务系统的状态监控器类StateMonitor：
 *          - 监控交易会话的状态变化和生命周期
 *          - 管理会话的初始化、接收、暂停、关闭等状态
 *          - 支持交易时段管理和时间段检查
 *          - 提供会话状态查询和批量状态检查
 *          - 集成基础数据管理器和数据管理器
 *          - 支持多线程状态监控和自动状态转换
 *          - 提供节假日状态处理
 *          - 支持状态变化事件通知
 */
#pragma once
#include <vector>
#include "../Share/StdUtils.hpp"
#include "../Includes/FasterDefs.h"

/**
 * @enum tagSimpleState
 * @brief 简单状态枚举
 * @details 定义交易会话的各种状态
 */
typedef enum tagSimpleState
{
	SS_ORIGINAL,		/*!< 未初始化状态 */
	SS_INITIALIZED,		/*!< 已初始化状态 */
	SS_RECEIVING,		/*!< 接收数据状态 */
	SS_PAUSED,			/*!< 暂停状态 */
	SS_CLOSED,			/*!< 关闭状态 */
	SS_PROCING,			/*!< 处理业务状态 */
	SS_PROCED,			/*!< 盘后已处理状态 */
	SS_Holiday	= 99	/*!< 节假日状态 */
} SimpleState;

/**
 * @struct _StateInfo
 * @brief 状态信息结构体
 * @details 存储交易会话的完整状态信息和时间段配置
 */
typedef struct _StateInfo
{
	char		_session[16];	/*!< 会话标识符 */
	uint32_t	_init_time;		/*!< 初始化时间 */
	uint32_t	_close_time;	/*!< 关闭时间 */
	uint32_t	_proc_time;		/*!< 处理时间 */
	SimpleState	_state;			/*!< 当前状态 */

	/**
	 * @struct _Section
	 * @brief 时间段结构体
	 * @details 定义交易时间段的开始和结束时间
	 */
	typedef struct _Section
	{
		uint32_t _from;	/*!< 开始时间 */
		uint32_t _end;	/*!< 结束时间 */
	} Section;
	std::vector<Section> _sections;	/*!< 交易时间段列表 */

	/**
	 * @brief 检查是否在交易时间段内
	 * @details 检查指定时间是否在任一交易时间段内
	 * @param curTime 当前时间
	 * @return bool 是否在交易时间段内
	 */
	bool isInSections(uint32_t curTime)
	{
		for (auto it = _sections.begin(); it != _sections.end(); it++)
		{
			const Section& sec = *it;
			if (sec._from <= curTime && curTime < sec._end)
				return true;
		}
		return false;
	}

	/**
	 * @brief 构造函数
	 * @details 初始化状态信息，设置默认值
	 */
	_StateInfo()
	{
		_session[0] = '\0';
		_init_time = 0;
		_close_time = 0;
		_proc_time = 0;
		_state = SS_ORIGINAL;
	}
} StateInfo;

typedef std::shared_ptr<StateInfo> StatePtr;					/*!< 状态信息智能指针类型 */
typedef faster_hashmap<std::string, StatePtr>	StateMap;		/*!< 状态映射表类型 */

class WTSBaseDataMgr;
class DataManager;

/**
 * @class StateMonitor
 * @brief 状态监控器类
 * 
 * @details StateMonitor是WonderTrader数据服务系统的状态监控器，负责：
 *          - 监控和管理交易会话的状态变化
 *          - 处理会话的生命周期管理（初始化、接收、暂停、关闭等）
 *          - 管理交易时间段和时间检查
 *          - 提供状态查询和批量状态检查功能
 *          - 支持多线程状态监控和自动状态转换
 *          - 集成基础数据管理器进行会话配置管理
 *          - 配合数据管理器进行数据处理状态控制
 *          - 支持节假日状态处理和特殊状态管理
 *          - 提供状态变化事件通知机制
 * 
 * @note 该类是数据服务系统的重要组件，负责会话状态的统一管理
 * @warning 状态转换必须按照正确的顺序进行，避免状态混乱
 */
class StateMonitor
{
public:
	/**
	 * @brief 构造函数
	 * @details 初始化状态监控器，设置默认参数
	 */
	StateMonitor();
	
	/**
	 * @brief 析构函数
	 * @details 清理资源，停止监控线程
	 */
	~StateMonitor();

public:
	/**
	 * @brief 初始化状态监控器
	 * @details 根据配置文件初始化状态监控器和会话状态
	 * @param filename 配置文件名
	 * @param bdMgr 基础数据管理器
	 * @param dtMgr 数据管理器
	 * @return bool 初始化是否成功
	 */
	bool		initialize(const char* filename, WTSBaseDataMgr* bdMgr, DataManager* dtMgr);

	/**
	 * @brief 检查是否有任一会话处于指定状态
	 * @details 检查是否有任何一个会话处于指定状态
	 * @param ss 目标状态
	 * @return bool 是否有会话处于指定状态
	 */
	bool		isAnyInState(SimpleState ss) const;
	
	/**
	 * @brief 检查是否所有会话都处于指定状态
	 * @details 检查是否所有会话都处于指定状态
	 * @param ss 目标状态
	 * @return bool 是否所有会话都处于指定状态
	 */
	bool		isAllInState(SimpleState ss) const;

	/**
	 * @brief 检查指定会话是否处于指定状态
	 * @details 检查指定会话是否处于指定状态
	 * @param sid 会话标识符
	 * @param ss 目标状态
	 * @return bool 会话是否处于指定状态
	 */
	bool		isInState(const char* sid, SimpleState ss) const;

	/**
	 * @brief 启动状态监控
	 * @details 启动状态监控线程，开始监控会话状态变化
	 */
	void		run();
	
	/**
	 * @brief 停止状态监控
	 * @details 停止状态监控线程，结束状态监控
	 */
	void		stop();

private:
	StateMap		_map;		/*!< 状态映射表 */
	WTSBaseDataMgr*	_bd_mgr;	/*!< 基础数据管理器 */
	DataManager*	_dt_mgr;	/*!< 数据管理器 */

	StdThreadPtr	_thrd;		/*!< 监控线程 */

	bool			_stopped;	/*!< 停止标志 */
};
